<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test.js"></script>
</head>
<body>
<script>

description("This tests the constructors for all the event DOM classes that have them.");

function test(toEval, bubblesExpected, cancelableExpected)
{
    if (bubblesExpected) {
        shouldBe("(" + toEval + ").bubbles", "true");
    } else {
        shouldBe("(" + toEval + ").bubbles", "false");
    }

    if (cancelableExpected) {
        shouldBe("(" + toEval + ").cancelable", "true");
    } else {
        shouldBe("(" + toEval + ").cancelable", "false");
    }
}

// No initializer passed.
test("new Event('eventType')", false, false);

// Both true.
test("new Event('eventType', { bubbles: true, cancelable: true })", true, true);

// One true, one false.
test("new Event('eventType', { bubbles: true, cancelable: false })", true, false);

// One explicitly undefined.
test("new Event('eventType', { bubbles: true, cancelable: undefined })", true, false);

// One a numeric value.
test("new Event('eventType', { bubbles: true, cancelable: 0 })", true, false);

// One missing.
test("new Event('eventType', { bubbles: true })", true, false);

// Empty initalizer.
test("new Event('eventType', { })", false, false);

// null initializer.
test("new Event('eventType', null)", false, false);

// Explicitly undefined initializer.
test("new Event('eventType', undefined)", false, false);

// A number as the initializer.
shouldThrow("new Event('eventType', 0)");

// The window as the initializer.
test("new Event('eventType', window)", false, false);

// The window as the initializer, but with bubbles defined to true.
var bubbles = true;
test("new Event('eventType', window)", true, false);

// One value defined on the prototype chain of a host object.
Document.prototype.bubbles = true;
test("new Event('eventType', document)", true, false);

// One value defined on the prototype chain of a vanilla object.
var Constructible = function() { }
Constructible.prototype.bubbles = true;
var constructible = new Constructible;
test("new Event('eventType', constructible)", true, false);

// Additional properties on the initializer
test("new Event('eventType', { bubbles: true, cancelable: true, other: true })", true, true);

// One getter returning true.
test("new Event('eventType', { bubbles: true, get cancelable() { return true; } })", true, true);

// One getter returning false.
test("new Event('eventType', { bubbles: true, get cancelable() { return false; } })", true, false);

// One getter throws an exeception.
shouldThrow("new Event('eventType', { bubbles: true, get cancelable() { throw 'Custom Error'; } })")
</script>
</body>
</html>
